//package com.codingstudy.login.convert;
//
//import com.alibaba.fastjson.annotation.JSONField;
//import com.alibaba.fastjson.serializer.SerializeConfig;
//import com.alibaba.fastjson.serializer.SerializerFeature;
//import com.alibaba.fastjson.serializer.ToStringSerializer;
//import com.alibaba.fastjson.serializer.ValueFilter;
//import com.alibaba.fastjson.support.config.FastJsonConfig;
//import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
//import io.micrometer.core.instrument.util.StringUtils;
//import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.http.MediaType;
//import org.springframework.util.ReflectionUtils;
//import java.text.SimpleDateFormat;
//import java.util.*;
//import java.util.concurrent.ConcurrentHashMap;
//
///**
// * 时间的返回值设置，需要在实体类的字段使用@JSONField(format="yyyy-MM-dd HH:mm:ss")设置时间格式,此配置会使得JsonFormat失效
// *
// * @Author: wangzhengsheng@supcon.com
// * @Create: 2021/7/19 14:26
// */
//@Configuration
//public class FastJsonConfiguration {
//    @Bean
//    public HttpMessageConverters fastJsonHttpMessageConverters() {
//        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
//        FastJsonConfig fastJsonConfig = new FastJsonConfig();
//        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
//        fastJsonConfig.setSerializerFeatures(
//                SerializerFeature.WriteDateUseDateFormat,
//                SerializerFeature.WriteNullNumberAsZero,    // 将数值类型字段的空值输出为0
//                SerializerFeature.PrettyFormat,             //结果是否格式化,默认为false
//                SerializerFeature.WriteNullStringAsEmpty,      // 将字符串类型字段的空值输出为空字符串
//                SerializerFeature.WriteMapNullValue,        // 是否输出值为null的字段,默认为false,我们将它打开
//                SerializerFeature.WriteNullListAsEmpty,      // 将Collection类型字段的字段空值输出为[]
//                SerializerFeature.DisableCircularReferenceDetect    // 消除对同一对象循环引用的问题，默认为false
//
//        );
//
//        fastJsonConfig.setSerializeFilters(new ValueFilter() {
//            // Map<class,Map<filed,dateFormat>>
//            Map<Class, Map<String, String>> dateFormatCache = new ConcurrentHashMap<>();
//
//            //遍历所有的返回值,修改返回值的格式
//            @Override
//            public Object process(Object obj, String key, Object value) {
//
//                if (value instanceof Date) {
//                    Class<?> objClass = obj.getClass();
//                    if (dateFormatCache.get(objClass) == null) {
//                        dateFormatCache.putIfAbsent(objClass, new HashMap<>());
//                        Map<String, String> newFormatMap = dateFormatCache.get(objClass);
//                        ReflectionUtils.doWithFields(obj.getClass(), (field) -> {
//                            if (field.getType() == Date.class) {
//                                JSONField annotation = field.getAnnotation(JSONField.class);
//                                if (annotation != null) {
//                                    String format = annotation.format();
//                                    if (StringUtils.isNotBlank(format)) {
//                                        newFormatMap.putIfAbsent(field.getName(), format);
//                                    }
//                                }
//                            }
//                        });
//                    }
//
//                    Map<String, String> dateFormatMap = dateFormatCache.get(objClass);
//                    if (!dateFormatMap.isEmpty()) {
//                        String format = dateFormatMap.get(key);
//                        if(StringUtils.isNotBlank(format)) {
//                            SimpleDateFormat sdf = new SimpleDateFormat(format);
//                            return sdf.format(value);
//                        }
//                    }
//                }
//                return value;
//            }
//        });
//
//        //中文乱码解决方案
//        List<MediaType> fastMedisTypes = new ArrayList<MediaType>();
//        //设定Json格式且编码为utf-8
//        fastMedisTypes.add(MediaType.APPLICATION_JSON_UTF8);
//        fastConverter.setSupportedMediaTypes(fastMedisTypes);
//        //将转换规则应用于转换对象
//        fastConverter.setFastJsonConfig(fastJsonConfig);
//
//        //long返回给前端转换为String
//        SerializeConfig serializeConfig = fastJsonConfig.getSerializeConfig();
//        serializeConfig.put(Long.class, ToStringSerializer.instance);
//        serializeConfig.put(Long.TYPE, ToStringSerializer.instance);
//        fastConverter.setFastJsonConfig(fastJsonConfig);
//
//        return new HttpMessageConverters(fastConverter);
//    }
//
//}
